// 学习目标
// 为什么需要对象？
// 使用字面量创建对象
// 使用构造函数创建对象
// 能够说出new的执行过程
// 能够遍历对象

// 在js中，对象是一组无序的相关属性和方法的集合，所有的事物都是对象，例如字符串、数值、数组和函数等。
//js中不同于其他的面向对象语言如java c#等，这些语言中都是通过原型来实现面向对象编程

//创建对象有三种方式
// 1、利用字面量创建对象 对象的字面量是{}
// 2、利用new object 创建对象
// 3、利用构造函数创建对象

console.log('利用字面量创建对象');
var obj = {
    uname: '张三丰',
    age: 18,
    sex: '男',
    sayHi: function () {
        console.log('hi~');
    },
};

// 构建函数的注意事项
// 1 里面的属性或者方法我们采取键值对的形式 键 属性名： 值 属性值
// 2 多个属性或者方法中间用逗号隔开的
// 3 方法冒号后面跟的是一个匿名函数

// 2.使用对象
// （1） 调用对象的属性 我们采取 对象名.属性名
console.log(obj.uname);
// (2)调用对象的另一种方法 对象名['属性名']
console.log(obj['age']);
// (3)调用对象的方法 sayHi 对象名.方法名
obj.sayHi();

//变量和属性 函数和方法之间的区别
// 变量是单独声明并赋值 直接写变量名并单独存在
// 属性在对象里不需要声明的 在使用的时候必须是对象.属性
// 函数和方法之间的关系也是如此

//利用new Object也可以创建对象
var obj = new Object(); //创建了一个空的对象
obj.uname = '小黑';
obj.sex = '男';
obj.sayHi = function () {
    console.log('你好~');
};

// 利用等号赋值的方法 添加对象的属性和方法

//利用构造函数创建对象 使用构造函数创建对象的原因是使用前面两种方法一次只能创建一个对象，里面很多属性和方法是大量相同的，因此封装成函数
// 因为这函数的特殊性 里面封装的不是普通代码而是对象
// 构造函数 就是把对象里面一些相同的属性和方法抽象出来封装到函数里

//以下利用构造函数创建对象  创建四大天王   相同的属性：名字、年龄、性别、相同的方法：唱歌
// 构造函数的声明如下：
// function 构造函数名(){
//     this.属性=值;
//     this.方法=function(){

//     }
// }
// // 调用构造函数如下
// new 构造函数名();

function Star(uname, age, sex) {
    this.name = uname;
    this.age = age;
    this.sex = sex;
    this.sing = function (song) {
        console.log(song);
    };
}
var ldh = new Star('刘德华', 18, '男');
var zxy = new Star('张学友', 19, '男');
zxy.sing('遥远的她');

//构造函数注意事项：
//构造函数首字母名字要大写
// 构造函数不需要return 就可以返回结果
// 我们调用构造函数 必须使用new

//new执行过程
// 1、在内存中创建一个空的对象
// 2、让this指向这个新的对象
// 3、执行构造函数里的代码，给这个对象添加属性和方法
// 4、返回这个新对象(因此构造函数不需要return语句)

// 遍历对象属性 对象的属性是无序的 用for in循环遍历比较方便
// 格式 如下 for(变量 in 对象){ }
for (var k in obj) {
    console.log(k); // 得到的是属性名 name age sex
    console.log(obj[k]); //得到的是属性值
}
